//
//  CZStatusDAL.swift
//  CZ29VVeibo
//
//  Created by apple on 16/7/8.
//  Copyright © 2016年 apple. All rights reserved.
//

import UIKit
// 清理缓存时间
private let Time: Double = -60*50
class CZStatusDAL: NSObject {

    /*
        - 为什么缓存微博数据？
            - 如果本地有该条微博数据 直接从本地取 为用户节省流量
        - 读取缓存数据的过程
            - 开启app 请求数据
                - 01 检查本地是否有该条数据
                        - 有  直接使用
                        - 没有 再网络请求  然后在保存网络下载下来的微博数据
    
   
    */
    // 检查本地是否有缓存数据
    class func checkCache(sinceId:Int64, maxId: Int64, success: SuccessClosure, failure: FailureClosure) {
        
        
        let result = getCache(sinceId, maxId: maxId)
        // 本地有数据从本地取数据
        if result?.count > 0 {
            print("本地获取")
            success(response: result)
            
        }else {
            // 本地没有数据 需要到网络请求
            CZNetworktools.sharedTools.homeLoadStatusData(sinceId, maxId: maxId, success: { (response) -> () in
                // 判断我们请求回来数据是否有值 而且是否是一个数组
                guard let res = response?["statuses"] as?[[String: AnyObject]] else {
                    print("返回数据为nil 或者 类型不匹配")
                    return
                }
                print("网络获取")
                success(response: res)
                // 保存数据
                saveCache(res)
                }, failure: { (error) -> () in
                    failure(error: error)
                    
            })
            
        }
    }
    
    // 查询本地微博数据
    class func getCache(sinceId:Int64, maxId: Int64) -> [[String: AnyObject]]?{
        // 获取用户uid
        guard let userId = CZUserAccountTools.sharedTools.userAccount?.uid else {
            print("用户没有登录")
            return nil
        }
        // 准备sql
        var sql = "SELECT * FROM T_Status\n"
        sql += "WHERE userid = \(userId)\n"
        // 代表下拉刷新
        if sinceId > 0{
            sql += "AND statusid > \(sinceId)\n"
        }
        // 上拉加载更多
        if maxId > 0 {
            sql += "AND statusid <= \(maxId)\n"
        }
        sql += "ORDER BY statusid DESC\n"
        sql += "LIMIT 20\n"
        
        // 执行sql
        let result = SQLManager.sharedTools.execRecord(sql)
        // 创建一个可变的临时数组
        var tempArray:[[String: AnyObject]] = [[String: AnyObject]]()
        // 遍历数组
        for dic in result {
            let data = dic["status"] as! NSData
            let dict = try! NSJSONSerialization.JSONObjectWithData(data, options: []) as! [String: AnyObject]
            // 保存数据
            tempArray.append(dict)
        }
        return tempArray
    }
    
    // 保存网络下载的微博数据
    class func saveCache(status: [[String: AnyObject]]) {
        // 用户id
        guard let userId = CZUserAccountTools.sharedTools.userAccount?.uid else {
            print("用户没有登录")
            return
        }
        
        // 准备sql
        // REPLACE 如果上次已经保存微博id 为1234的数据了 然后下次可能重复保存 会造成数据库保存 所以采用 或者替换方式
        let sql = "INSERT OR REPLACE INTO T_Status (statusid,status,userid) VALUES (?,?,?)"
        // 执行sql
        SQLManager.sharedTools.queue.inTransaction { (db, rollback) -> Void in
            
            // 循环
            for dic in status {
                // 微博id 
                let statusId = dic["id"] as! NSNumber
                // 微博数据
                let statusDic = try! NSJSONSerialization.dataWithJSONObject(dic, options: [])
                
                let result = db.executeUpdate(sql, withArgumentsInArray: [statusId,statusDic,userId])
                
                if result {
                    print("保存数据成功")
                }else {
                    print("保存数据失败")
                    // 失败回滚
                    rollback.memory = true
                }
            }
        }
    }
    
    // 删除缓存数据
    class func deleteCache() {
        // 获取当前时间 2016-07-08 10:39:37
        let date = NSDate(timeIntervalSinceNow: Time)
        // 
        let df = NSDateFormatter()
        // 指定区域
        df.locale = NSLocale(localeIdentifier: "en_US")
        // 指定格式
        df.dateFormat = "yyyy-MM-dd HH:mm:ss"
        // 时间字符串
        let timeStr = df.stringFromDate(date)
        print(timeStr)
        // 准备sql
        let sql = "DELETE FROM T_Status WHERE createtime < '\(timeStr)'"
        // 执行sql
        SQLManager.sharedTools.queue.inDatabase { (db) -> Void in
            let result = db.executeUpdate(sql, withArgumentsInArray: nil)
            if result {
                print("删除缓存成功")
            }else {
                print("删除缓存失败")
            }
        }
        
    }

}
